define([
  'jquery',
  'GlobalInfo',
  'Grid',
  'Validator',
  'bootstrap',
  'navBar-general',
  'jquery-ui.min'
],
function ($, GlobalInfo, Grid, Validator) {
  GlobalInfo.BlockUI("Cargando...");
  $(function(){
      GlobalInfo.CheckSession();
      var userId = 0;
      var roles = null;
      var params = {
        sessionUUID: GlobalInfo.sessionUUID,
        roleNameFilter: ''
      };

      GlobalInfo.CallWebService('UserServices', 
                                 'GetAllUsers', 
                                 params, 
                                 GetAllUsersSuccessCallback,
                                 GetAllUsersErrorCallback);
      $("#cancel").click(function(){
        CloseDialog();
      });      

      $("#newuser").click(function(){
        OpenDialog();  
      });

      $("#yes").click(function() {
        var params = {
          sessionUUID: GlobalInfo.sessionUUID,
          userId: userId
        }

        GlobalInfo.CallWebService('UserServices', 
                                  'DeleteUser', 
                                  params, 
                                  DeleteUserSuccessCallback, 
                                  DeleteUserErrorCallback);
      });

      $("#no").click(function() {
        $("#deleteDialog").dialog("close");
      });

      $("#save").click(function() {
        var userName = $('#Name').val();
        var isActive = false;
        var selects;
        var params;
    
        //Validations
        if(Validator.IsLength($('#Login').val(), 3)){
          GlobalInfo.DialogShowMessage("El nombre del usuario tiene que ser mayor a 3 caracteres", true, 5000);
          return;
        }

        if(Validator.IsLength($('#Name').val(), 3)){
          GlobalInfo.DialogShowMessage("El nombre real tiene que ser mayor a 3 caracteres", true, 5000);
          return;
        }

        if(!Validator.IsEmail($('#Email').val())){
          GlobalInfo.DialogShowMessage("El correo electrónico no es correcto", true, 5000);
          return;
        }

        if(Validator.IsLength($('#Password').val(), 6)){
          GlobalInfo.DialogShowMessage("La contraseña tiene que tener al menos 6 caracteres", true, 5000);
          return;
        }

        params = {
          sessionUUID: GlobalInfo.sessionUUID,
          modifiedUserId: userId,
    		  loginName:$('#Login').val(),
    		  displayName:$('#Name').val(), 
    		  password:$('#Password').val(),
          email:$('#Email').val(),
    		  roleId:$('#Roles').find('option:selected').attr('id').toString().split('-')[1], 
    		  enabledStr:$("#Activo").prop('checked')
        }

        GlobalInfo.CallWebService('UserServices', 
                                  'SaveUser', 
                                  params, 
                                  SaveUserSuccessCallback, 
                                  SaveUserErrorCallback);
      });

      function GetAllUsersSuccessCallback(resultObj){
        if(resultObj.error() != null){
          GlobalInfo.ShowMessage(resultObj.error(), true, 0);
        }
        else{
          users = resultObj.result().User;
          console.log(users);
          columnNames= [{label:"Nombre de Usuario", value:"LoginName"},
                        {label:"Nombre",value:"DisplayName"},
                        {label:"Fecha de Creaci&oacute;n",value:'CreationDateStr'},
                        {label:"Acciones", value:"Action"}];

          var grid = new Grid(users);
          grid.clear();

          var buttons = [];

          var editButton = $('<button>')
                          .text('Editar')
                          .attr('id','edit')
                          .attr('name','edit')
                          .addClass('btn')
                          .click(
                              function(evt){
                                var selectedObj = grid.dataSource[grid.selectedIndex];
                                if(typeof GlobalInfo.userId != 'undefined' && GlobalInfo.userId == selectedObj.UserId){
                                        $('<div></div>')
                                        .appendTo('body')
                                        .html('<div><h6>Si modifica este usuario su sesión será terminada</h6></div>')
                                        .dialog({
                                            modal: true, title: 'Confirmación', zIndex: 10000, autoOpen: true,
                                            width: 'auto', resizable: false,
                                            buttons: {
                                                Ok: function () {
                                                    OpenDialog(selectedObj);
                                                    $(this).dialog("close");
                                                },
                                                Cancelar: function () {
                                                    $(this).dialog("close");
                                                }
                                            },
                                            close: function (event, ui) {
                                                $(this).remove();
                                            }
                                        });
                                    }         
                                    else{
                                        OpenDialog(selectedObj);
                                    }    
                              });

           var deleteButton = $('<button>')
                            .text('Borrar')
                            .attr('id','delete')
                            .attr('name','delete')
                            .addClass('btn btn-danger')
                            .click(
                              function(){
                                var selectedObj = grid.dataSource[grid.selectedIndex];
                                userId = selectedObj.UserId;

                                if(typeof GlobalInfo.userId != 'undefined' && GlobalInfo.userId == selectedObj.UserId){
                                        $('<div></div>')
                                        .appendTo('body')
                                        .html('<div><h6>Si elimina este usuario su sesión será terminada</h6></div>')
                                        .dialog({
                                            modal: true, title: 'Confirmación', zIndex: 10000, autoOpen: true,
                                            width: 'auto', resizable: false,
                                            buttons: {
                                                Ok: function () {
                                                    $("#deleteDialog").dialog({
                                                      dialogClass: "no-close",
                                                      modal: "true",
                                                      width:  350,
                                                      height: 150,
                                                      position: 'center'
                                                    });
                                                    $('#deleteMessage').text("Está seguro de que desea eliminar al usuario: " + selectedObj.DisplayName);
                                                    $(this).dialog("close");
                                                },
                                                Cancelar: function () {
                                                    $(this).dialog("close");
                                                }
                                            },
                                            close: function (event, ui) {
                                                $(this).remove();
                                            }
                                        });
                                    }         
                                    else{
                                      $("#deleteDialog").dialog({
                                        dialogClass: "no-close",
                                        modal: "true",
                                        width:  350,
                                        height: 150,
                                        position: 'center'
                                      });
                                      $('#deleteMessage').text("Está seguro de que desea eliminar al usuario: " + selectedObj.DisplayName);
                                  }    
                              });                        
            buttons[buttons.length] = editButton;
            buttons[buttons.length] = deleteButton;

            grid.createGrid(columnNames, buttons);
            grid.excludeColumn("Action", FilterStatic);
            
            GlobalInfo.UnblockUI();
        }
      }


        function GetAllUsersErrorCallback(error){
          GlobalInfo.UnblockUI();
          GlobalInfo.ShowMessage('Ocurrió un error inesperado. Por favor intente más tarde.', true, 5000);
        }

        function SaveUserSuccessCallback(resultObj){
          if(GlobalInfo.userId == userId){
            GlobalInfo.Logout();
          }
          else{
            if(resultObj.error() != null){
              GlobalInfo.ShowMessage(resultObj.error(), true, 5000);
            }
            else{
              var params = {
                  sessionUUID: GlobalInfo.sessionUUID,
                  roleNameFilter: ''
                };
              GlobalInfo.ShowMessage('Se ha guardado el usuario correctamente', false, 5000);
              GlobalInfo.CallWebService('UserServices', 
                                         'GetAllUsers', 
                                         params, 
                                         GetAllUsersSuccessCallback,
                                         GetAllUsersErrorCallback);
            }
            $('#dialog').dialog( "close" );
          }
        }

        function SaveUserErrorCallback(error){
          $('#dialog').dialog( "close");
          GlobalInfo.ShowMessage('Ocurrió un error inesperado. Por favor intente más tarde.', true, 5000);
        }

        function GetAllRolesSuccessCallback(resultObj){
          $('#Roles option').remove();
          roles = resultObj.result().Role;
          for(var i=0;i<roles.length;i++){
             var option = $("<option></option>");
             option.html(roles[i].Name);
             $("#Roles").append(option);
			       option.attr("id","RoleId-" + roles[i].RoleId);
          }
          GlobalInfo.UnblockUI();
        
        }
    
        function GetAllRolesErrorCallback(error){
          GlobalInfo.ShowMessage('Ocurrió un error inesperado. Por favor intente más tarde.', true, 5000);
        }


        function DeleteUserSuccessCallback(resultObj){ 
          if(GlobalInfo.userId == userId){
            GlobalInfo.Logout();
          }
          else{
            if(resultObj.error() != null){
              GlobalInfo.ShowMessage(resultObj.error(), true, 5000);
            }
            else{
              var params = {
                  sessionUUID: GlobalInfo.sessionUUID
                };
              GlobalInfo.ShowMessage('Se ha eliminado el usuario correctamente', false, 5000);
              GlobalInfo.CallWebService('UserServices', 
                                        'GetAllUsers', 
                                        params, 
                                        GetAllUsersSuccessCallback,
                                        GetAllUsersErrorCallback);
            }
            $("#deleteDialog").dialog("close");
          }
        }

        function DeleteUserErrorCallback(error){
          $("#deleteDialog").dialog("close");
          GlobalInfo.ShowMessage('Ocurrió un error inesperado. Por favor intente más tarde.', true, 5000);
        }

        function OpenDialog(selectedObj){
          var params = {
            sessionUUID: GlobalInfo.sessionUUID,
            roleNameFilter: ''
          };

          GlobalInfo.CallWebService(
            'RoleServices', 
            'GetAllRoles', 
            params, 
            function(resultObj){
              GetAllRolesSuccessCallback(resultObj);
              if(typeof selectedObj != "undefined" && selectedObj != null){
                $('#Login').val(selectedObj.LoginName);
                $('#Name').val(selectedObj.DisplayName);
                $('#Email').val(selectedObj.Email);
                $('#Password').val("U*N*C*H*A*N*G*E*D*");
                
                $('input[name=Activo]').attr('checked', (typeof selectedObj.IsActive != "undefined" && selectedObj.IsActive != null && selectedObj.IsActive == "true"));
                $("#Roles option[id='RoleId-"+selectedObj.RoleId+"']").attr("selected", "selected");

                userId = selectedObj.UserId;
              }
              else{
                $('#Name').val("");
                $('#Login').val("");
                $('#Email').val("");
                $('#Password').val("");

                $('input[name=Activo]').attr('checked', true);
                $('#Roles').find('option:selected').removeAttr('selected');

                userId = 0;
              }

              $("#dialog" ).dialog({
                  dialogClass: "no-close",
                  modal: "true",
                  width:  750,
                  height: 500,
                  position: 'center'
              });
            },
            GetAllRolesErrorCallback);
      }

      function CloseDialog(){
        $("#dialog").dialog("close");
      }

      function FilterStatic(obj){
        return obj.IsStatic == true || obj.IsStatic == 1 || obj.IsStatic == "true";
      }
    });
});